#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

//...表示不定参，__VA_ARGS__使用不定参
// __FILE__ 文件名
//__LINE__ 行号
//__VA_ARGS__ 用于在宏替换部分中，表示可变参数列表；
// 当可变参数的个数为0时，##起到把前面多余的","去掉的作用,否则会编译出错
#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);
// 最终展开的代码相当于printf("[%s:%d]" "可变参数列表",__FILE__,__LINE__)

void print(int cnt, ...)
{
    va_list ap;
    va_start(ap, cnt); // 获取cnt参数之后的第一个参数的地址，第一个不定参地址
    for (int i = 0; i < cnt; ++i)
    {
        int num = va_arg(ap, int); // 获取不定参
        printf("param[%d]:%d\n", i, num);
    }
    va_end(ap); // 使用完将ap指针置空
}

void MyPrint(const char *fmt, ...)
{
    va_list ap;
    va_start(ap,fmt);
    char* res;
    int ret=vasprintf(&res,fmt,ap);
    if(ret  ==-1)
    {
        printf(res);
        free(res);
    }
    va_end(ap);
    
}





int main()
{
    // LOG("可变参数列表");
    // printf("%d""nihao",6);
    // print(3,1,3,5);

    // MyPrint("%d,%s", 666, "wmh");
    
    return 0;
}